<?php
/**
 * Crud um para muitos
 * @author Emanuel @ PC4 Team em 15/02/2012
 *
 */
class PC4_Crud_UmParaMuitos extends PC4_Db_Table {
	
	public 
		$tabelaCategoria, // Nome da tabela de categoria
		$modeloCategoria, // Zend_Db_Table
		$pkCategoria, // Nome da chave primaria da tabela de categorias
		$nomeCategoria, // Nome do campo referente ao nome da categoria
		$fk,// Nome da chave estrangeira da tabela principal na "tabela Muitos"
		$camposFk; // Campos que deseja trazer da tabela FK
		
    function init() {
    	parent::init();
    	if ($this->config['tbCategoria'] == null) {
    		$this->config['tbCategoria'] = $this->_name . '_categorias';
		}
// TODO será que é melhor não ter um modelo específico para tabela relacionada?
		$this->modeloCategoria = new PC4_Db_Table($this->config['tbCategoria']);
		$info = $this->modeloCategoria->info();
		$this->tabelaCategoria = $info['name'];
		
		$this->fk = (empty($this->config['fk'])) ? $this->config['primary'] . '_' . $this->tabelaCategoria : $this->config['fk'];
		$this->pkCategoria = (empty($this->config['pkCategoria'])) ? 'id' : $this->config['pkCategoria'];
		$this->nomeCategoria = (empty($this->config['nomeCategoria'])) ? 'nome' : $this->config['nomeCategoria'];
		$this->campoCategoria = (empty($this->config['campoCategoria'])) ? '' : $this->config['campoCategoria'];
		$this->camposFk = (empty($this->config['camposFk'])) ? array() : $this->config['camposFk'];
    }
    /**
     * Devolve a lista de categorias indexados por pk
     * @return array
     */
    function getCategorias($where = null, $order = null, $count = null, $offset = null) {
    	/*
    	$where = $this->getSelect($where);
    	$where->from($this->tabelaCategoria);
    	$where->setIntegrityCheck(false);
    	$rsCategorias = $this->getLista($where, $order, $count, $offset);
    	*/
		$pk = $this->pkCategoria;
		$nome = $this->nomeCategoria;
		if (empty($order)) {
			$order = $nome;
		}
		$rsCategorias = $this->modeloCategoria->getLista($where, $order, $count, $offset);
		
		$categorias = array();
		foreach($rsCategorias as $r){
			$categorias[$r->$pk] = $r->$nome;
		}
		return $categorias;
    }
    
    /**
     * Devolve um conjunto de registros relacionados as suas categorias
     * @return Zend_Db_Table_Rowset
     */
    function preparaConsulta(&$where = null, $order = null, $count = null, $offset = null) {
    	$select = parent::preparaConsulta($where, $order, $count, $offset);
    	$select->setIntegrityCheck(false);
    	$alias = $this->getAlias($this->_name);
    	$aliasCategoria = $this->getAlias($this->tabelaCategoria);
		
    	$campoCategoria = (empty($this->campoCategoria)) ? $aliasCategoria . '.' . $this->nomeCategoria : $this->campoCategoria;
    	$columns = array($this->nomeCategoria . ucfirst($this->tabelaCategoria) => $campoCategoria);
    	$select->joinLeft(
        	array($aliasCategoria => $this->tabelaCategoria), 
        	$aliasCategoria . '.' . $this->pkCategoria . ' = ' . $alias . '.' . $this->fk,
        	$columns
        );
        
    	if(!empty($this->camposFk)){
    		$select->columns($this->camposFk);
    	}

    	if (!empty($this->config['group'])) {
			$select->group($this->config['group']);
		}
        
        $where = $select;
    	return $select;
    }
    
    /**
     * Devolve conjunto de registro em que cada row vem o total da categoria
     * @return Zend_Db_Table_Rowset
     */
    public function getTotalPorCategoria($where = null, $order = null, $count = null, $offset = null) {
    	$select = $this->getSelect($where);
    	$select->setIntegrityCheck(false);
		$select->reset(Zend_Db_Select::COLUMNS);
    	$select->from(array(), array('totalCategoria' => 'COUNT(' . $this->aliasRel . '.' . $this->pk . '_' . $this->_name . ')'));
		$select->group($this->aliasCategoria . '.' . $this->pk);
    	return $this->getLista($select, $order, $count, $offset);
    }  
}